package com.operator.Activitys.adapter;

import android.content.Context;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import com.google.gson.Gson;
import com.operator.Activitys.R;
import com.operator.Activitys.bean.UploadImage;
import com.operator.Activitys.utils.Constant;
import com.operator.Activitys.utils.FileUtils;
import com.operator.Activitys.utils.LogUtils;
import com.operator.Activitys.utils.ToastUtils;
import com.operator.Activitys.view.ProcessJustImageView;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import io.github.lizhangqu.coreprogress.ProgressHelper;
import io.github.lizhangqu.coreprogress.ProgressUIListener;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * 项目名称：金泽云 手机app
 * 类描述：添加 适配器
 * 创建人：张飞祥
 * 创建时间：2018/5/21 13:21
 * 修改人：张飞祥
 * 修改时间：2018/5/21 13:21
 * 修改备注：
 */
public class AddSupplyAdapter extends BaseAdapter {

    //全局 上下文
    private Context mContext;

    boolean flag = true;

    //本地图片地址
    private List<String> mList;
    //上传图片 的 Flag （true：当前位置可以继续上传，false：当前位置不可以上传了）
    private List<Boolean> mHttpImgFlag = new ArrayList<>();
    //上传的图片的 Url
    private List<String> mHttpImgList = new ArrayList<>();
    //布局获取器
    private LayoutInflater inflater;

    /**
     * 构造方法
     * @param mContext
     * @param mList
     */
    public AddSupplyAdapter(Context mContext, List<String> mList) {
        this.mContext = mContext;
        this.mList = mList;

        /**
         * 初始化 上传图片 Flag
         */
        for(int i = 0;i < Constant.MAX_SELECT_PIC_NUM;i++){
            mHttpImgFlag.add(i,true);
            mHttpImgList.add(i,"");
        }
        inflater = LayoutInflater.from(mContext);
    }

    /**
     * 动态设置 count
     * @return
     */
    @Override
    public int getCount() {
        //return mList.size() + 1;//因为最后多了一个添加图片的ImageView
        int count = mList == null ? 1 : mList.size() + 1;
        if (count > Constant.MAX_SELECT_PIC_NUM) {
            return mList.size();
        } else {
            return count;
        }
    }

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    //给外部 暴露 删除某一个图片
    public void setDeleteItemImg(int position){
        //清除某一条数据
        mList.remove(position);

        //清除某一条的 图片上传标记
        mHttpImgFlag.remove(position);

        //在后面追加一个 图片上传标记
        mHttpImgFlag.add(true);

        //清除某一条的 图片 http Url
        mHttpImgList.set(position,"");

        //TODO 刷新
        notifyDataSetChanged();
    }

    //提供给外部获取 当前上传图片 url 地址 集合
    public List<String> getHttpUrls(){
        return mHttpImgList;
    }

    //提供给外部 调用 本地图片路径 集合
    public List<String> getImgList(){
        return mList;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //获取 根布局
        convertView = inflater.inflate(R.layout.item_add_supply, parent,false);
        //获取 JustImageView 控件
        ProcessJustImageView iv = (ProcessJustImageView) convertView.findViewById(R.id.iv_item_add_supply);
        //图片 uri
        Uri imgUri = null;

        /**
         * 业务逻辑 判断，是否 需要显示 添加按钮
         */
        if (position < mList.size()) {
            //代表+号之前的需要正常显示图片
            String picUrl = mList.get(position); //图片路径

            if (!"".equals(picUrl) && picUrl !=null){
                //TODO 判断当前版本 ，设置 文件获取方式
                imgUri = Uri.fromFile(new File(picUrl));
                //显示相应的图片
                iv.setImageURI(imgUri);

                if (position > 0 && mHttpImgFlag.get(position)){
                    //开始上传文件
                    uploadFile(imgUri,position,iv);
                }else if (mHttpImgFlag.get(0) && position == 0){

                    mHttpImgFlag.set(0,false);

                    //开始上传文件
                    uploadFile(imgUri,position,iv);
                }
            }
        } else {
            iv.setImageResource(R.drawable.ic_add_img);//最后一个显示加号图片
        }

        return convertView;
    }


    /**
     * 文件上传 带进度 （okHttp）
     *
     * @param uri
     */
    private void uploadFile(final Uri uri, final int position, final ProcessJustImageView imageView) {
        //获取 要上传的 文件 path
        String filePath = FileUtils.getRealFilePath(mContext, uri);
        //添加要上传的文件
        File uploadFile = new File(filePath);
        //要上传的 地址
        String url = Constant.HTTP_URL + "RFIs/AppUploaderRFIsImg";

        //TODO 创建一个 okHttp 请求
        OkHttpClient okHttpClient = new OkHttpClient();

        //TODO 创建 一个 bodyBuilder
        MultipartBody.Builder bodyBuilder = new MultipartBody.Builder();
        bodyBuilder.setType(MultipartBody.FORM);

        //文件...参数name指的是请求路径中所接受的参数...如果路径接收参数键值是file
        //此处应该改变
        bodyBuilder.addFormDataPart("file", uploadFile.getName(), RequestBody.create
                (MediaType.parse("application/octet-stream"), uploadFile));
        //构建
        MultipartBody multipartBody = bodyBuilder.build();

        //TODO  获取 上传进度
        RequestBody requestBody = ProgressHelper.withProgress(multipartBody, new ProgressUIListener() {
            @Override
            public void onUIProgressStart(long totalBytes) {
                super.onUIProgressStart(totalBytes);
                LogUtils.i("uploadFile：--------------->开始上传");
            }

            @Override
            public void onUIProgressChanged(long numBytes, long totalBytes, final float percent, float speed) {
                imageView.setProgress((int) (100 * percent));
                LogUtils.i("uploadFile：--------------->"+(int) (100 * percent));
            }

            @Override
            public void onUIProgressFinish() {
                super.onUIProgressFinish();
                LogUtils.i("uploadFile：--------------->结束上传");
            }
        });

        //创建Request
        Request request = new Request.Builder().url(url).post(requestBody).build();

        //TODO 获取当前网络请求状态
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            //请求出错
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            //请求成功 返回结果
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //得到服务器返回的具体内容
                String responseData = response.body().string();
                //开始解析 转换为 实体数据
                Gson gson = new Gson();
                UploadImage image = gson.fromJson(responseData + "", UploadImage.class);
                //已经上传过的 图片不允许在上传了
                mHttpImgFlag.set(position,false);

                //TODO 网络请求业务逻辑判断
                if (image.getState().equals("1")) {
                    mHttpImgList.set(position,image.getSrc());
                } else {
                    ToastUtils.showShort(mContext, image.getMsg());
                }
            }
        });
    }

}
